
/**
 * 求两个字符串的最长公共子序列
 * @param {string} str1
 * @param {string} str2
 * @return {number} 最长公共子序列的长度
 */
export function LCS(str1, str2) {
  const m = str1.length;
  const n = str2.length;
  const dp = [new Array(n + 1).fill(0)]; //第一行全是0
  for (let i = 1; i <= m; i++) {
    //一共有m+1行
    dp[i] = [0]; //第一列全是0
    for (let j = 1; j <= n; j++) {
      //一共有n+1列
      if (str1[i - 1] === str2[j - 1]) {
        //注意这里，str1的第一个字符是在第二列中，因此要减1，str2同理
        dp[i][j] = dp[i - 1][j - 1] + 1; //对角＋1
      } else {
        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }
  return dp[m][n];
}

/**
 * 防抖函数
 * @param {() => {}} fn
 * @param {number} wait
 * @return {() => {}}
 */
export function debounce(fn, wait) {
  let timer = null;
  return function () {
    if (timer !== null) {
      clearTimeout(timer);
    }
    timer = setTimeout(fn, wait);
  };
}

// return true if number m is between a and b
export function isBetween(m, a, b) {
  if (m >= a && m <= b) {
    return true
  }
  if (m >= b && m <= a) {
    return true
  }
  return false
}

export const removeArrayItem = (array, item) => {
  const index = array.indexOf(item);
  if (index >= 0) {
    array.splice(index, 1);
  }
};
export const replaceArrayItem = (array, newItem, oldItem) => {
  const index = array.indexOf(oldItem);
  if (index >= 0) {
    array[index] = newItem
  }
};

// 集合A - 集合B，arrA 会被修改，arrB不改变
export function arrAsubB(arrA, arrB) {
  arrB.forEach((it) => {
    const ind = arrA.indexOf(it);
    if (ind >= 0) {
      arrA.splice(ind, 1);
    }
  });
  return arrA;
}

// 集合A 与 集合B 的交集
export function arrAintersectB(arrA, arrB) {
  const target = [];
  arrB.forEach((it) => {
    const ind = arrA.indexOf(it);
    if (ind >= 0) {
      target.push(it)
    }
  });
  return target;
}
// 集合A 与 集合B 的并集
export function arrAunionB(arrA, arrB) {
  const target = [...arrA];
  arrB.forEach((it) => {
    const ind = arrA.indexOf(it);
    if (ind < 0) {
      target.push(it)
    }
  });
  return target;
}

export function getLocalItem(key) {
  const data = localStorage.getItem(key)
  if (!data) {
    return null
  }
  try {
    return JSON.parse(data)
  } catch (e) {
    console.error(e)
    return null
  }
}

export function setLocalItem(key, value) {
  if (value === undefined || value === null) {
    localStorage.removeItem(key)
  } else {
    localStorage.setItem(key, JSON.stringify(value))
  }
}
